package semaforo;

/**
 * Implementacion de Semaforo utilizando metodos synchronized.
 *@see Semaforo
 *
 */
public class SemaforoImpl implements Semaforo {

	private int cantDisponible;

	/**
	 * Inicializa el semaforo seteando la cantidad de recursos totales.
	 * 
	 * @param cantRecursos
	 */
	public SemaforoImpl(int recursos) {
		cantDisponible = recursos;
	}


	/**
	 * @see Semaforo#consumir()
	 *
	 */
	public synchronized void consumir() {

		while (cantDisponible <= 0) {
			try {
				wait();
			} catch (InterruptedException e) {
				// No interesa si hay una exception en este punto.
			}
		}
		cantDisponible--;
		notifyAll();

	}

	/**
	 * @see Semaforo#liberar()
	 *
	 */
	public synchronized void liberar() {
		
		cantDisponible++;
		notifyAll();

	}

	public int getCantDisponible() {
		return cantDisponible;
	}


	public void setCantDisponible(int cantDisponible) {
		this.cantDisponible = cantDisponible;
	}
}
